package com.cskaoyan.javase.oop3._2inner._5anonymous._2usecase;

/**
 * 使用场景
 * 匿名内部类实际上就是更简单的局部内部类（直接获取了对象）
 *  所以局部内部类的使用场景，可以直接套用过来。
 *  实际开发中,匿名内部类基本上可以取代局部内部类的使用场景。
 *
 * 匿名内部类经常使用在以下两个场景中：
 * 方法需要返回一个对象，返回值类型是引用数据类型时。
 * 方法需要返回一个对象时，可以在方法的局部位置写一个 基于X类或X接口的匿名内部类对象 ，然后直接作为返回值返回给外界。
 * 方法需要传入一个对象，形参数据类型是引用数据类型时。
 * 方法需要传入一个对象实参时，可以在调用方法的实参位置填入一个 基于X类或X接口的匿名内部类对象，就将它作为一个实参传给方法使用。
 * 使用匿名内部类的优点：
 * 绝对对外界隐藏，封装。
 * 比起局部内部类，它更方便简洁了。所以实际开发中，匿名内部类基本取代了局部内部类的作用。
 * 缺点：
 * 这个对象是一次性的。
 * 总之，酌情使用匿名内部类对象，可以简化代码书写，方便省事。但不要为了使用而使用，假如存在多个场景都需要一个子类对象，那还是直接创建一个子类出来好了。
 * @since 15:10
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        test(new IAImpl());
        class IAImpl implements IA {
            @Override
            public void method() {
                System.out.println("我是局部内部类的做法,我高级一些~");
            }
        }
        test(new IAImpl());
        test(new IA() {
            @Override
            public void method() {
                System.out.println("我是匿名内部类的做法，我更高级~");
            }
        });
        IA ia = test();
        ia.method();
    }

    public static IA test(){
        return new IA() {
            @Override
            public void method() {
                System.out.println("我是匿名内部类的做法，我更上流优雅~");
            }
        };
    }

    public static void test(IA a) {
        a.method();
    }
}

class IAImpl implements IA {
    @Override
    public void method() {
        System.out.println("我是常规做法，一般方法~");
    }
}

interface IA {
    void method();
}